package com.ruoyi.common.utils.ps2;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.*;
import java.nio.file.*;

public class ImageMover{

    // 配置路径 - 根据实际情况修改这些路径
    private static final String EXCEL_FILE = "C:\\Users\\xinhuiRong\\Desktop\\重复对比.xlsx";
    private static final String BASE_DIR = "J:\\BaiduNetdiskDownload\\新统计\\总图";
    private static final String ORIGIN_IMAGE_DIR = BASE_DIR + "/原图";
    private static final String EDITED_IMAGE_DIR = BASE_DIR + "/处理图";
    private static final String NEW_ORIGIN_DIR = BASE_DIR + "/重复原图";  // 与原图同级
    private static final String NEW_EDITED_DIR = BASE_DIR + "/重复处理图"; // 与处理图同级

    public static void main(String[] args) {
        // 创建日志记录器
        SystemLogger logger = new SystemLogger();

        try {
            logger.log("开始处理不合格图片移动任务");
            logger.log("================================================");

            // 1. 读取Excel文件
            logger.log("正在读取Excel文件: " + EXCEL_FILE);
            Workbook workbook = WorkbookFactory.create(new File(EXCEL_FILE));
            Sheet sheet = workbook.getSheetAt(0); // 获取第一个工作表

            // 2. 创建目标文件夹结构
            logger.log("正在创建目标文件夹结构");
            Files.createDirectories(Paths.get(NEW_ORIGIN_DIR));
            Files.createDirectories(Paths.get(NEW_EDITED_DIR));

            logger.log("创建目标文件夹: " + NEW_ORIGIN_DIR);
            logger.log("创建目标文件夹: " + NEW_EDITED_DIR);

            // 3. 处理Excel中的每一行
            logger.log("\n开始处理Excel数据行...");
            int totalRows = 0;
            int originMoved = 0;
            int editedMoved = 0;
            int originMissing = 0;
            int editedMissing = 0;

            // 使用DataFormatter处理各种类型的单元格
            DataFormatter dataFormatter = new DataFormatter();

            // 从第二行开始处理（跳过标题行）
            for (int rowNum = 1; rowNum <= sheet.getLastRowNum(); rowNum++) {
                Row row = sheet.getRow(rowNum);
                if (row == null) continue;

                totalRows++;

                // 获取原图文件名（A列）
                Cell originCell = row.getCell(0);
                // 获取编辑图文件名（B列）
                Cell editedCell = row.getCell(1);

                String originName = "";
                String editedName = "";

                if (originCell != null) {
                    originName = dataFormatter.formatCellValue(originCell);
                }

                if (editedCell != null) {
                    editedName = dataFormatter.formatCellValue(editedCell);
                }

                // 只去除文件名最后的空格
                originName = removeTrailingSpaces(originName);
                editedName = removeTrailingSpaces(editedName);

                String originFileName = originName + ".jpg";
                String editedFileName = editedName + ".jpg";

                logger.log("\n处理行 " + (rowNum + 1) + ":");
                logger.log("  原图文件名: " + originName);
                logger.log("  编辑图文件名: " + editedName);

                // 处理原图文件
                Path originSource = Paths.get(ORIGIN_IMAGE_DIR, originFileName);
                Path originDest = Paths.get(NEW_ORIGIN_DIR, originFileName);

                if (Files.exists(originSource)) {
                    try {
                        Files.move(originSource, originDest, StandardCopyOption.REPLACE_EXISTING);
                        logger.log("  原图移动成功: " + originDest);
                        originMoved++;
                    } catch (IOException e) {
                        logger.log("  原图移动失败: " + e.getMessage());
                    }
                } else {
                    logger.log("  原图文件不存在: " + originSource);
                    originMissing++;
                }

                // 处理编辑图文件
                Path editedSource = Paths.get(EDITED_IMAGE_DIR, editedFileName);
                Path editedDest = Paths.get(NEW_EDITED_DIR, editedFileName);

                if (Files.exists(editedSource)) {
                    try {
                        Files.move(editedSource, editedDest, StandardCopyOption.REPLACE_EXISTING);
                        logger.log("  编辑图移动成功: " + editedDest);
                        editedMoved++;
                    } catch (IOException e) {
                        logger.log("  编辑图移动失败: " + e.getMessage());
                    }
                } else {
                    logger.log("  编辑图文件不存在: " + editedSource);
                    editedMissing++;
                }
            }

            workbook.close();

            // 4. 输出统计信息
            logger.log("\n处理完成!");
            logger.log("================================================");
            logger.log("处理统计:");
            logger.log("  总处理行数: " + totalRows);
            logger.log("  原图移动成功: " + originMoved);
            logger.log("  编辑图移动成功: " + editedMoved);
            logger.log("  原图缺失数量: " + originMissing);
            logger.log("  编辑图缺失数量: " + editedMissing);
            logger.log("\n目标文件夹:");
            logger.log("  不合格原图: " + NEW_ORIGIN_DIR);
            logger.log("  不合格处理图: " + NEW_EDITED_DIR);

        } catch (Exception e) {
            System.err.println("程序发生严重错误: " + e.getMessage());
            e.printStackTrace();
        }
    }

    /**
     * 只移除字符串末尾的空格
     */
    private static String removeTrailingSpaces(String str) {
        if (str == null || str.isEmpty()) {
            return str;
        }

        int end = str.length() - 1;
        while (end >= 0 && Character.isWhitespace(str.charAt(end))) {
            end--;
        }

        return end < 0 ? "" : str.substring(0, end + 1);
    }

    /**
     * 日志记录类
     */
    static class SystemLogger {
        void log(String message) {
            // 获取当前时间
            String timestamp = java.time.LocalDateTime.now().toString();
            // 格式化输出
            System.out.println("[" + timestamp + "] " + message);

            // 同时写入日志文件
            try {
                Path logDir = Paths.get(System.getProperty("user.dir"), "logs");
                Files.createDirectories(logDir);

                Path logFile = logDir.resolve("image_mover.log");
                Files.write(logFile, (timestamp + " - " + message + "\n").getBytes(),
                        StandardOpenOption.CREATE, StandardOpenOption.APPEND);
            } catch (IOException e) {
                System.err.println("日志写入失败: " + e.getMessage());
            }
        }
    }
}